/////////////////////////////////////////////////////////////////////////////
// Name:        qb_modules_normal.h
// Purpose:     
// Author:      syy
// Modified by: 
// Created:     2020-03-04 16:44:43 
// RCS-ID:      
// Copyright:   
// Licence:     
/////////////////////////////////////////////////////////////////////////////
#ifndef _QB_MODULES_NORMAL_H_
#define _QB_MODULES_NORMAL_H_
#include "core/common_types.h"
#include "core/comdefs.h"
#include <map>
#include <string.h>

struct ComObjItem
{
	IID riid;
	void* ppv;
};
struct IIDPred
{
	bool operator()(const IID &x,const IID &y) const
	{
		return memcmp(&x,&y,sizeof(IID)) < 0;
	}
};
typedef std::map<IID,ComObjItem,IIDPred> ComObjs;
struct ComItem 
{
	CLSID clsid;
	ComObjs objs;
};
struct CLSIDPred
{
	bool operator()(const CLSID &x,const CLSID &y) const
	{
		return memcmp(&x,&y,sizeof(CLSID)) < 0;
	}
};
typedef std::map<CLSID,ComItem,CLSIDPred> Coms;

typedef long(*AppUICreateObject)(REFCLSID rclsid, REFIID riid, LPVOID* ppv);

namespace qb
{
    class QbModules
	{
	public:
		QbModules();
        
		virtual ~QbModules();
        
		virtual int32_t LoadResource(const char* exepath);
        
		virtual int32_t UnloadResource();

		virtual int32_t QueryInterface(REFCLSID rclsid,REFIID riid,void** ppv);

	private:
		virtual int32_t CreateInstance(REFCLSID rclsid,REFIID riid,void** ppv);

	private:
		Coms	m_modules;
		void*	m_hAppUIDll;
	};
}

#endif // _QB_MODULES_NORMAL_H_
